using System;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using NEXServicio;
using System.Data;


namespace NEXEntidad
{
    #region Editorial
    public class Editorial : NEXEntidadElemento
    {
        #region Constructores
        public Editorial(int id)
            : base(id)
        {
            this.Id = id;
        }

        public Editorial()
            : base()
        {
        }
        public Editorial(int id, string nombre, string isbn, int anio, int pagina, Image imagen, string nombreTapaLibro)
            : base(id)
        {
            this.Nombre = nombre;
            this.Isbn = isbn;
            this.Anio = anio;
            this.Paginas = pagina;
            this.TapaImagen = imagen;
            this.NombreFileImagen = nombreTapaLibro;
        }

        #endregion

        #region Campos / Propiedades

        private Libro fLibro;
        public Libro Libro
        {
            get { return fLibro; }
            set { fLibro = value; }
        }

        /// <summary>
        /// Nombre de la editorial
        /// </summary>
        private string fNombre;
        public string Nombre
        {
            get { return fNombre; }
            set { fNombre = value; }
        }

        /// <summary>
        /// Isbn del Libro en esta editorial
        /// </summary>
        private string fIsbn;
        public string Isbn
        {
            get { return fIsbn; }
            set { fIsbn = value; }
        }

        /// <summary>
        /// Anio de publicacion del libro en esta editorial
        /// </summary>
        private int fAnio;
        public int Anio
        {
            get { return fAnio; }
            set { fAnio = value; }
        }

        /// <summary>
        /// Numero de paginas que tiene el libro 
        /// en la publicacion de esta editorial
        /// </summary>
        private int fPaginas;
        public int Paginas
        {
            get { return fPaginas; }
            set { fPaginas = value; }
        }

        /// <summary>
        /// Imagen de la tapa del libro.
        /// </summary>
        private Image fTapaImagen;
        public Image TapaImagen
        {
            get { return fTapaImagen; }
            set { fTapaImagen = value; }
        }

        /// <summary>
        /// Nombre del archivo de la tapa del libro
        /// </summary>
        private string fNombreFileImagen;
        public string NombreFileImagen
        {
            get { return fNombreFileImagen; }
            set { fNombreFileImagen = value; }
        }

        private string fInfoEditorial;
        public string InfoEditorial
        {
            get { return fInfoEditorial; }
            set { fInfoEditorial = value; }
        }

        #endregion

        #region Metodos de Carga
        internal static EditorialCollection CrearListaUnElemento(DataRow drEditorial)
        {
            EditorialCollection editoriales = new EditorialCollection();
            Editorial editorial = new Editorial();
            if (drEditorial["Editorial_IdEditorial"] != DBNull.Value)
            {
                editorial.Id = Convert.ToInt32(drEditorial["Editorial_IdEditorial"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
                editorial.NombreFileImagen = (drEditorial["Editorial_NombreTapa"] != DBNull.Value) ? "tapaLibros/" + drEditorial["Editorial_NombreTapa"].ToString() : "images/img_silueta_libros.jpg";;
            }
            else
            {
                editorial.Id = 0;
                editorial.NombreFileImagen = "images/img_silueta_libros.jpg";
                
            }
            editoriales.Add(editorial);
            return editoriales;
        }
        internal static EditorialCollection CrearListaCargada(DataRowCollection drEditoriales)
        {
            EditorialCollection editoriales = new EditorialCollection();
            foreach (DataRow drEditorial in drEditoriales)
            {
                editoriales.Add(Editorial.CrearCargado(drEditorial));
            }
            return editoriales;
        }

        private static Editorial CrearCargado(DataRow drEditorial)
        {
            Editorial editorial = new Editorial(Convert.ToInt32(drEditorial["idEditorial"].ToString()));
            Editorial.Cargar(editorial, drEditorial);
            return editorial;
        }

        private static void Cargar(Editorial editorial, DataRow drEditorial)
        {
            editorial.Id = Convert.ToInt32(drEditorial["IdEditorial"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            editorial.Nombre = drEditorial["Nombre"].ToString();
            editorial.Isbn = drEditorial["Isbn"].ToString();
            editorial.Paginas = Convert.ToInt32(drEditorial["Paginas"].ToString());
            editorial.Anio = Convert.ToInt32(drEditorial["Anio"].ToString());
            editorial.TapaImagen = Generales.Bytes_Imagen(drEditorial["TapaLibro"] != DBNull.Value ? (byte[])drEditorial["TapaLibro"] : null);
            editorial.NombreFileImagen = drEditorial["NombreTapaLibro"].ToString();
            editorial.InfoEditorial = drEditorial["InfoEdicion"].ToString();

            editorial.ObjetoCargado();
        }

        protected override void Obtener()
        {
            using (DataSet ds = ServicioEditorial.Obtener(this.Id, true))
            {
                DataTable dtEditorial = ds.Tables[ServicioEditorial.DataTableName];
                if (dtEditorial.Rows.Count > 0)
                {
                    DataRow drEditorial = dtEditorial.Rows[0];
                    Editorial.Cargar(this, drEditorial);
                }
                else
                {
                    throw new ObjetoInexistenteException("Editorial");
                }
            }

        }

        #endregion

        #region Metodos para Salvar
        protected override int SalvarObjeto(NEX_Datos.Transaccion transaccion)
        {
            Int32 idEditorial = ServicioEditorial.Salvar(transaccion, this.Id,
                                                    this.Nombre, this.Isbn, this.Anio, this.Paginas, this.Libro.Id,
                                                    Generales.Imagen_Bytes(this.TapaImagen), this.NombreFileImagen);
            return idEditorial;
        }
        #endregion

        #region Metodos Publicos

        public static EditorialCollection ListarPorLibro(Int32 idLibro, Boolean completo)
        {
            return Editorial.CrearListaCargada(ServicioEditorial.ListarPorLibro(idLibro, completo).Tables[ServicioEditorial.DataTableName].Rows);
        }
        #endregion

    }
    #endregion

    #region EditorialCollection

    [Serializable]
    public class EditorialCollection : NEXCollection<Editorial>
    {
    }

    #endregion
}
